home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-13
/
xvisrc.zip
/
BUFFERS.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-07-28
|
3KB
|
150 lines
/* Copyright (c) 1990,1991,1992 Chris and John Downey */
#ifndef lint
static char *sccsid = "@(#)buffers.c 2.1 (Chris & John Downey) 7/29/92";
#endif
/***
* program name:
xvi
* function:
PD version of UNIX "vi" editor, with extensions.
* module name:
buffers.c
* module function:
Handle buffer allocation, deallocation, etc.
* history:
STEVIE - ST Editor for VI Enthusiasts, Version 3.10
Originally by Tim Thompson (twitch!tjt)
Extensive modifications by Tony Andrews (onecom!wldrdg!tony)
Heavily modified by Chris & John Downey
***/
#include "xvi.h"
static bool_t setup_buffer P((Buffer *));
/*
* Create a new buffer.
*/
Buffer *
new_buffer()
{
Buffer *new;
new = (Buffer *) alloc(sizeof(Buffer));
if (new == NULL) {
return(NULL);
}
/*
* Allocate memory for lines etc.
*/
if (setup_buffer(new) == FALSE) {
free((char *) new);
return(NULL);
}
/*
* Since setup_buffer() does not set up
* the filenames, we must do it ourselves.
*/
new->b_filename = NULL;
new->b_tempfname = NULL;
new->b_nwindows = 0;
return(new);
}
/*
* Delete the given buffer.
*/
void
free_buffer(buffer)
Buffer *buffer;
{
if (buffer == NULL)
return;
/*
* Free all the lines in the buffer.
*/
throw(buffer->b_line0);
free((char *) buffer);
}
/*
* Free up all the memory used indirectly by the buffer,
* and then get some new stuff. This only has an effect
* on the allocated fields within the buffer, i.e. it
* does not change any variables such as filenames.
*
* Returns TRUE for success, FALSE for failure to get memory.
*/
bool_t
clear_buffer(buffer)
Buffer *buffer;
{
/*
* Free all the lines in the buffer.
*/
throw(buffer->b_line0);
return(setup_buffer(buffer));
}
/*
* Allocate and initialise a buffer structure.
*
* Don't touch filenames.
*
* Returns TRUE for success, FALSE if we couldn't get memory.
*/
static bool_t
setup_buffer(b)
Buffer *b;
{
/*
* Allocate the single "dummy" line, and the two
* out-of-bounds lines for lines 0 and (n+1).
* This is a little strange ...
*/
b->b_line0 = newline(0);
b->b_file = newline(1);
b->b_lastline = newline(0);
if (b->b_line0 == NULL || b->b_file == NULL || b->b_lastline == NULL) {
return(FALSE);
}
/*
* Connect everything togther to form a minimal list.
*/
b->b_line0->l_next = b->b_file;
b->b_file->l_prev = b->b_line0;
b->b_file->l_next = b->b_lastline;
b->b_lastline->l_prev = b->b_file;
/*
* Clear all marks.
*/
init_marks(b);
/*
* Clear the undo status of the buffer.
*/
init_undo(b);
/*
* Clear all flags, and then pay special attention to the
* "noedit" flag which must be set if the parameter is FALSE.
*/
b->b_flags = 0;
if (!Pb(P_edit)) {
b->b_flags |= FL_NOEDIT;
}
return(TRUE);
}